iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
Software Development

從 Fragment 到 Compose — 老 Android App 重寫的架構取捨系列 第 8 篇

Day 08|Design system:token、theme、元件的邊界

  • 分享至 

  • xImage
  •  

動筆前先答(兩題)

1.【模擬面試追問|UI 與版型】 面試官看到 internal val LocalSpacing = staticCompositionLocalOf { Spacing() },問:「為什麼用 staticCompositionLocalOf,不用 compositionLocalOf?假設之後間距要跟著視窗寬度換一組值(平板上間距加大),使用者把摺疊機展開的那一刻,這兩種寫法在重組上各會發生什麼事?你還會選 static 嗎?」

我的回答:

官方文件:
staticCompositionLocalOf 是 Jetpack Compose 中用來建立全域或區域隱含資料傳遞物件(CompositionLocal)的 API。

與 compositionLocalOf 不同,staticCompositionLocalOf 的讀取操作不會被 composer 追蹤,因此更改 CompositionLocalProvider 呼叫中提供的值會導致整個內容重新組合,而不僅僅是組合中使用該本地值的地方。然而,這種缺乏追蹤的特性使得 staticCompositionLocalOf 在提供的值極不可能或永遠不會更改時更有效率。例如,Android 上下文、字體載入器或類似的共享值不太可能在 CompositionLocalProvider 的內容元件中更改,因此應考慮使用 staticCompositionLocalOf。顏色或其他主題之類的值可能會更改,甚至可能帶有動畫效果,因此應使用 compositionLocalOf。

在間距要跟著視窗寬度換一組值(平板上間距加大)的場景,staticCompositionLocalOf 的改變會全量重組。

Pablo Costa:
簡而言之:不要根據數據變化的頻率來選擇,而是根據數據的閱讀範圍來選擇。

Jetpack Compose: Static vs Dynamic CompositionLocals — Reads, Writes and Trade Offs

2.【決策邊界|UI 與版型】 假設公司決定讓同事改用 10 吋平板,橫放在車上操作,任務列表要變成左邊列表、右邊詳情的兩欄。今天的 Modifier.maxContentWidth()(單欄內容置中、上限 600dp)在這個畫面還適用嗎?你會在什麼條件下切成兩欄?判斷依據要放在哪一層:design system、app 還是 feature?為什麼?

我的回答:
(待補)


上一篇
Day 07 | 導航:型別安全路由與 feature 的對外 API
下一篇
Day 09|測試基礎與架構守門:fake vs mock、Konsist
系列文
從 Fragment 到 Compose — 老 Android App 重寫的架構取捨 共 11 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言